/**
 * 数字千分位格式化（仅接收数字参数，保留原始小数点位数）
 * @param {string | number} num - 要格式化的数字（支持数字或字符串类型）
 * @returns {string} 格式化后的千分位字符串（保留原始小数位数）
 */
export function formatNumberWithThousands(num: string | number) {
    // 处理非数字情况
    if (num === null || num === undefined) {
        return '0';
    }

    // 转换为字符串处理（避免数字精度丢失，保留原始小数位数）
    const numStr = typeof num === 'number' ? num.toString() : num.trim();

    // 验证是否为有效数字格式（允许整数、小数，不允许其他字符）
    if (!/^-?\d+(\.\d+)?$/.test(numStr)) {
        return '0';
    }

    // 分割整数和小数部分（保留原始小数位数）
    const parts = numStr.split('.');
    const integerPart = parts[0]; // 整数部分（可能包含负号）
    const decimalPart = parts[1] || ''; // 小数部分（完全保留原始位数）

    // 处理整数部分的千分位（忽略负号，最后再拼接）
    const isNegative = integerPart.startsWith('-');
    const pureInteger = isNegative ? integerPart.slice(1) : integerPart;
    // 正则：从右向左每3位数字前加逗号（仅处理纯数字部分）
    const formattedPureInteger = pureInteger.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
    const formattedInteger = isNegative ? `-${formattedPureInteger}` : formattedPureInteger;

    // 拼接结果（保留原始小数部分，无小数则只返回整数部分）
    return decimalPart ? `${formattedInteger}.${decimalPart}` : formattedInteger;
}




/**
 * 邮箱脱敏函数，使用固定数量的星号(*)对邮箱前缀进行脱敏处理
 * @param email - 需要脱敏处理的邮箱字符串
 * @returns 返回脱敏后的邮箱字符串，如果输入不是有效的邮箱格式则直接返回原字符串
 */
export const maskEmailFixedStars = (email: string) => {
    // 将邮箱分割为前缀和域名两部分
    const [prefix, domain] = email.split('@');
    if (!domain) return email; // 非邮箱格式直接返回
    // 前缀长度 ≤ 2：不脱敏
    if (prefix.length <= 2) {
        return `${prefix}@${domain}`;
    }
    // 前缀长度 > 2：前2位 + 三个*
    return `${prefix.slice(0, 2)}***@${domain}`;
}


/**
 * 根据传入时间戳，向下取整到各周期起点（1天/1周对齐到早8点）
 * 规则：传入时间所在周期的起始点（若刚好是周期起点则不变）
 * @param inputTimestamp 传入的时间戳（单位：ms）
 * @returns 各周期起点时间戳（单位：ms）
 */
export function getFloorPeriodTimestamps(inputTimestamp: number) {
    const inputDate = new Date(inputTimestamp);
    const inputMinutes = Math.floor(inputTimestamp / 60000); // 转换为总分钟数（忽略秒/毫秒）

    // 周期定义（分钟）
    const periods = {
        oneMinute: 1,
        fiveMinute: 5,
        fifteenMinute: 15,
        oneHour: 60,
        oneDay: 1440, // 24*60
        oneWeek: 10080 // 7*24*60
    };

    /**
     * 核心工具函数：向下取整到周期起点（分钟数）
     * @param timeMinutes 时间总分钟数
     * @param period 周期（分钟）
     * @returns 向下取整后的周期起点分钟数
     */
    const floorToPeriod = (timeMinutes: number, period: number) => {
        return Math.floor(timeMinutes / period) * period;
    };

    // 1. 1分钟周期（向下取整即当前分钟，无变化）
    const oneMinuteStart = floorToPeriod(inputMinutes, periods.oneMinute) * 60000;

    // 2. 5分钟周期（如11:29→11:25，11:30→11:30，11:31→11:30）
    const fiveMinuteStart = floorToPeriod(inputMinutes, periods.fiveMinute) * 60000;

    // 3. 15分钟周期
    const fifteenMinuteStart = floorToPeriod(inputMinutes, periods.fifteenMinute) * 60000;

    // 4. 1小时周期
    const oneHourStart = floorToPeriod(inputMinutes, periods.oneHour) * 60000;

    // 5. 1天周期（对齐到当天8点，若当前时间≥8点则取当天8点，否则取前一天8点）
    const dayStart = new Date(inputDate);
    dayStart.setHours(8, 0, 0, 0);
    const oneDayStart = inputDate >= dayStart
        ? dayStart.getTime()
        : new Date(dayStart.getTime() - 86400000).getTime(); // 前一天8点

    // 6. 1周周期（对齐到周一8点，若当前时间≥本周一8点则取本周一8点，否则取上周一8点）
    const weekday = inputDate.getDay() || 7; // 1=周一~7=周日
    const weekStart = new Date(inputDate);
    weekStart.setDate(inputDate.getDate() - (weekday - 1)); // 回退到当周周一
    weekStart.setHours(8, 0, 0, 0);
    const oneWeekStart = inputDate >= weekStart
        ? weekStart.getTime()
        : new Date(weekStart.getTime() - 604800000).getTime(); // 上周一8点

    return {
        '1MINUTE': oneMinuteStart,
        '5MINUTE': fiveMinuteStart,
        '15MINUTE': fifteenMinuteStart,
        '1HOUR': oneHourStart,
        '1DAY': oneDayStart,
        '1WEEK': oneWeekStart
    };
}